﻿using System.Collections.Generic;
using System.Configuration;
using System.Linq;

namespace Updater
{
	/// <summary>
	/// Класс, считывающий настройки приложения.
	/// </summary>
	public class UpdaterSettings
	{
		/// <summary>
		/// Путь к исходной папке.
		/// </summary>
		public string Source { get; private set; }

		/// <summary>
		/// Путь к конечной папке.
		/// </summary>
		public string Target { get; private set; }

		/// <summary>
		/// Массив путей к папкам, которые должны быть очищены.
		/// </summary>
		public string[] PureFolders { get; private set; }

		/// <summary>
		/// Массив путей к исключительным файлам.
		/// </summary>
		public string[] ExcludeFiles { get; private set; }

		/// <summary>
		/// Массив путей к исключительным папкам.
		/// </summary>
		public string[] ExcludeFolders { get; private set; }

		/// <summary>
		/// Будут ли совпадать папки после копирования.
		/// </summary>
		public bool FullMatchDirectories { get; private set; }

		/// <summary>
		/// Путь к файлу с информацией о файлах в релизе.
		/// </summary>
		public string PathToXmlFileWithFileInfoAboutFileInReleas { get; private set; }

		/// <summary>
		/// Путь к приложению, которое требуется запустить после обновления.
		/// </summary>
		public string ApplicationStart { get; set; }

		/// <summary>
		/// Имя процесса, который следует завершить перед обновлением.
		/// </summary>
		public string ProcessFinish { get; set; }

		/// <summary>
		/// Конструтор.
		/// </summary>
		public UpdaterSettings()
		{
			Source = GetValue("SourcePath");
			Target = GetValue("TargetPath");
			ExcludeFiles = GetArrayOf("ExcludeFiles");
			ExcludeFolders = GetArrayOf("ExcludeFolders");
			PureFolders = GetArrayOf("PureFolders");
			FullMatchDirectories = GetBool("FullMatchDirectories");
			PathToXmlFileWithFileInfoAboutFileInReleas = GetPath("PathToXmlFileWithFileInfoAboutFileInReleas");
			ApplicationStart = GetValue("appToStart");
			ProcessFinish = GetValue("processToFinish");
		}

		private string[] GetArrayOf(string name)
		{
			string value = GetValue(name);
			string[] result;

			if (value.Length != 0)
			{
				result = value.Split(';');
			}
			else
			{
				result = new string[0];
			}

			return result;
		}

		private string GetValue(string name)
		{
			return ConfigurationSettings.AppSettings[name];
		}

		private bool GetBool(string name)
		{
			string value = GetValue(name);

			if (value == "true")
			{
				return true;
			}

			return false;
		}

		private string GetPath(string name)
		{
			string value = GetValue(name);

			if (value.Length == 0)
			{
				return null;
			}

			return value;
		}
	}
}